package ar.edu.utn.frsf.tpae.a2012.g05.dao;

import java.math.BigDecimal;
import java.util.List;

import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.PersistenciaException;

public interface CuentaDao {

	/**
	 * Guarda o actualiza una cuenta dependiendo si se encuentra o no persistida.
	 * 
	 * @param cuenta la cuenta a persistir
	 * @return
	 */
	public Cuenta saveOrUpdate(Cuenta cuenta);
	
	/**
	 * Elimina una cuenta peristida.
	 * 
	 * @param cuenta la cuenta a eliminar
	 * @throws PersistenciaException si no se encuentra la cuenta 
	 */
	public void delete(Cuenta cuenta) throws PersistenciaException;
	
	/**
	 * 
	 * Busca una cuenta por su numero.
	 * 
	 * @param idCuenta
	 * @return una cuenta con el numero de cuenta buscado
	 */
	public Cuenta findById(Integer idCuenta);
	
	/**
	 * 
	 * Busca una cuenta por su numero.
	 * 
	 * @param numeroCuenta
	 * @return una cuenta con el numero de cuenta buscado
	 */
	public Cuenta findByNumber(Integer numeroCuenta);
	
	/**
	 * Retorna todas las cuentas de un cliente
	 * 
	 * @param idCliente el identificador del cliente
	 * @return  las cuentas asociadas al cliente
	 */
	public List<Cuenta> findCuentasCliente(Integer idCliente);
	
	/**
	 * Retorna todas las cuentas persistidas.
	 * 
	 * @return lista de cuentas persistidas 
	 */
	public List<Cuenta> findAll();
	
	/**
	 * Este metodo tiene la responsabilidad de retornar el saldo actual
	 * de la cuenta con el id que se le pasa como parametro.
	 * 
	 * @param idCliente
	 * @param idCuenta
	 * @return Saldo actual de la cuenta
	 * @throws PersistenciaException si no encuentra una cuenta con el idCuenta
	 */
	public BigDecimal getSaldo(Integer idCuenta) throws PersistenciaException;
	
	
	/**
	 * Este metodo tiene la responsabilidad de debitar un monto a una cuenta.
	 * 
	 * @param cuenta
	 * @param monto
	 */
	public void debitar(Cuenta cuenta, BigDecimal monto);
	
	
}
